using System;
using System.Collections.Generic;
using Xunit;
using WenYu.Core.Lexer;
using WenYu.Core.Parser;

namespace WenYu.Tests.DocumentValidation;

/// <summary>
/// 文档01-基础语法.md的示例验证测试
/// </summary>
public class Doc01BasicSyntaxValidation
{
    private List<Token> Tokenize(string source)
    {
        var lexer = new WenYuLexer(source);
        return lexer.Tokenize();
    }

    private Program Parse(string source)
    {
        var lexer = new WenYuLexer(source);
        var tokens = lexer.Tokenize();
        var parser = new WenYuParser(tokens);
        return parser.Parse();
    }

    [Fact]
    public void Example1_BasicVariableDeclaration()
    {
        var source = "整型 年龄 是 10。";
        
        var tokens = Tokenize(source);
        Assert.NotEmpty(tokens);
        
        var ast = Parse(source);
        Assert.NotNull(ast);
    }

    [Fact]
    public void Example2_MultipleTypes()
    {
        var source = @"整型 x 是 10。
实型 y 是 1.5。
文字 z 是 ""hello""。
真假 b 是 真真。";

        var tokens = Tokenize(source);
        Assert.NotEmpty(tokens);

        var ast = Parse(source);
        Assert.NotNull(ast);
    }

    [Fact]
    public void Example3_ArrayDeclaration()
    {
        var source = "整型 组 分数 是 【85，92，78】。";

        var tokens = Tokenize(source);
        Assert.NotEmpty(tokens);

        var ast = Parse(source);
        Assert.NotNull(ast);
    }

    [Fact]
    public void Example4_Operators()
    {
        var source = @"整型 a 是 10。
整型 b 是 3。
整型 c 是 a + b。";

        var tokens = Tokenize(source);
        Assert.NotEmpty(tokens);

        var ast = Parse(source);
        Assert.NotNull(ast);
    }

    [Fact]
    public void Example5_Comment()
    {
        var source = @"整型 年龄 是 10。  ——this is comment
整型 x 是 年龄 + 1。";

        var tokens = Tokenize(source);
        Assert.NotEmpty(tokens);

        var ast = Parse(source);
        Assert.NotNull(ast);
    }
}
